package family

import (
	"io/ioutil"
	"encoding/json"
	"errors"
)

//
// 设备信息
//
type DeviceCell struct {
	Name 	string 				`json:"name"`
	Id 		string				`json:"id"`
	Desc 	string				`json:"desc"`	// 对设备的描述信息

	Services 	[]*DevSevCell	`json:"services"`
}

// 设备初始化
func (dev *DeviceCell) Init() {
	// 初始化设备服务
	for _, sev := range dev.Services {
		sev.Init()
	}
}

//
// 设备离线
//
func (dev *DeviceCell) Offline() {
	// 所有服务业当即离线
	for _, sev := range dev.Services {
		sev.Init()
	}
}

//
// 设置设备服务状态
//
func (dev *DeviceCell) SetSevState(sev_id string, state string) error {
	err := errors.New("404")
	// 找到服务
	for _, sev := range dev.Services {
		if sev.Id == sev_id {
			return sev.SetState(state)
		}
	}
	return err
}

//
// 设置设备服务状态
//
func (dev *DeviceCell) SetSevStateDesc(sev_id string, desc string) error {
	err := errors.New("404")
	// 找到服务
	for _, sev := range dev.Services {
		if sev.Id == sev_id {
			sev.State.Desc = desc
			return nil
		}
	}
	return err
}

//
// 获取服务状态
//
func (dev *DeviceCell) GetSevState(sev_id string) (state *DevSevStateCell, err error) {
	state = nil
	err = errors.New("404")

	for _, sev := range dev.Services {
		if sev.Id == sev_id {
			state = sev.State
			err = nil
			return
		}
	}
	return
}

//
// 获取服务描述
//
func (dev *DeviceCell) GetSevDesc(sev_id string) (desc *DevSevDesc, err error) {
	desc = nil
	err = errors.New("404")

	for _, sev := range dev.Services {
		if sev.Id == sev_id {
			desc = sev.Desc
			err = nil
			return
		}
	}
	return
}

//
// 获取服务类型
//
func (dev *DeviceCell) GetSevType(sev_id string) (t string, err error) {
	t = ""
	err = errors.New("404")
	for _, sev := range dev.Services {
		if sev.Id == sev_id {
			t = sev.Type
			err = nil
			return
		}
	}
	return
}

// 设备的服务信息
type DevSevCell struct {
	Id 			string			`json:"id"`
	Type 		string			`json:"type"`
	IconType 	string			`json:"icon_type"`

	State 		*DevSevStateCell			// 服务当前的状态
	Operate 	[]*DevSevOperateCell		// 当前状态下所允许的操作集合

	Desc 		*DevSevDesc				`json:"description"`

	States 		[]*DevSevStateCell		`json:"states"`
	Operates	[]*DevSevOperateCell	`json:"operates"`
}


//
// 初始化服务状态
//
func (sev *DevSevCell) Init() error {
	if len(sev.States) > 0 {
		sev.State = sev.States[0]
		return nil
	}

	return errors.New("404")
}

//
// 设置服务状态
//
func (sev *DevSevCell) SetState(data string) error {
	err := errors.New("404")
	for _, state := range sev.States {
		if state.Type == data {
			sev.State = state
			return nil
		}
	}
	return err
}

// 服务描述信息
type DevSevDesc struct {
	Major 		string		`json:"major"`
	Minor 		string		`json:"minor"`
}

// 服务状态描述单元
type DevSevStateCell struct {
	Type 	string		`json:"type"`
	Desc 	string 		`json:"desc"`
}

// 服务操作信息描述单元
type DevSevOperateCell struct {
	Type 	string		`json:"type"`
	Desc 	string		`json:"desc"`
}

//
// 设备ID 与 设备实例对应列表
//
var (
	devices_conf_file = "conf/devices.json"
)

var DevicesMap = make(map[string]*DeviceCell)

//
// 设备设备初始化
//
func DevicesConf() error {
	// 读取配置文件
	buf, err := ioutil.ReadFile(devices_conf_file)
	if err != nil {
		return err
	}

	var devices []*DeviceCell
	err = json.Unmarshal(buf, &devices)
	if err != nil {
		return err
	}

	for _, dev := range devices {
		dev.Init()
		DevicesMap[dev.Id] = dev
	}

	return nil
}

